import { def } from "./utils";
import defineReactive from "./defineReactive";
import arrayMethods from "./array";

// 为了实现循环递归一个对象里的属性，我们需要创建一个类，命名为Observer
// 这个类的作用就是将一个正常的object转换为每个层级的属性都是响应式(可以被侦测的)object
// 创建一个类的时候，你一定要首先考虑这个类如何被实例化
export default class {
    constructor(value){
        // 注意一个基础知识，构造器中的this指向的是实例，不是类本身
        // 这一步就是把这个实例本身去赋值给他的__ob__属性
        def(value,'__ob__',this,false);
        if(Array.isArray(value)){
            Object.setPrototypeOf(value,arrayMethods);
        }
        else{
            this.walk(value);
        }
    }

    // 遍历
    walk(value){
        for(let key in value){
            defineReactive(value,key);
        }
    }
}